package cn.itsource.ymcc.service.impl;

import cn.itsource.ymcc.constant.RConst;
import cn.itsource.ymcc.domain.CourseType;
import cn.itsource.ymcc.mapper.CourseTypeMapper;
import cn.itsource.ymcc.result.JsonResult;
import cn.itsource.ymcc.service.ICourseTypeService;
import cn.itsource.ymcc.vo.CourseTypeCrumbsVo;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.conditions.query.QueryChainWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 课程目录 服务实现类
 * </p>
 *
 * @author zongchangjiang
 * @since 2023-06-26
 */
@Service
public class CourseTypeServiceImpl extends ServiceImpl<CourseTypeMapper, CourseType> implements ICourseTypeService {

    @Autowired
    private RedisTemplate<String,Object> redisTemplate;
    /**
     * 3.for循环+hashMap
     *  循环次数变成：行数的两倍  行数越多这个优化就越明显
     * @return
     */
    @Cacheable(cacheNames = "course",key = "'tree'")//底层还是redis  course::tree
    @Override
    public List<CourseType> getCourseTree() {
//        if(redisTemplate.hasKey("getCourseTree")){
//            return (List<CourseType>)redisTemplate.opsForValue().get("getCourseTree");
//        }

        List<CourseType> courseTypes = baseMapper.selectList(null);
        //顶级
        List<CourseType> topCourse = new ArrayList<>();
        //转换
        Map<Long,CourseType> courseTypeMap = new HashMap<>();
        for (CourseType courseType : courseTypes) {
            courseTypeMap.put(courseType.getId(),courseType);
        }
        for (CourseType courseType : courseTypes) {
            if(RConst.Num.BASE_LONG_0 == courseType.getPid()){
                topCourse.add(courseType);
            }else {
                CourseType parent = courseTypeMap.get(courseType.getPid());
                parent.getChildren().add(courseType);
            }
        }
//        redisTemplate.opsForValue().set("getCourseTree",topCourse);
        return topCourse;
    }

    @Override
    public JsonResult loadCrumbs(Long id) {
        //首先找到自己
        CourseType courseType = baseMapper.selectById(id);
        String path = courseType.getPath();//path里面包含 全部层级
        //1043 1044 1052
        String[] split = path.split("\\.");//学到起  这个.要转义

        //我们逻辑有问题  目前只查询自己的  没有上级的兄弟1
        //定义一个list 来装所有层级  按照顺序装
        List<CourseTypeCrumbsVo> list = new ArrayList<>();
        for (String s : split) {
            CourseTypeCrumbsVo courseTypeCrumbsVo = new CourseTypeCrumbsVo();
            //先找自己
            CourseType current = baseMapper.selectById(s);
            //找自己的兄弟
            Long pid = current.getPid();
            List<CourseType> bro = baseMapper.selectList(new QueryWrapper<CourseType>().eq("pid", pid));
            courseTypeCrumbsVo.setCurrent(current);
            courseTypeCrumbsVo.setBrothers(bro);
            list.add(courseTypeCrumbsVo);
        }
        return JsonResult.success().setData(list);
    }

    @Override
    public boolean save(CourseType entity) {
//        redisTemplate.delete("getCourseTree");
        return false;
    }

    @Override
    public boolean updateById(CourseType entity) {
//        redisTemplate.delete("getCourseTree");
        return false;
    }

    @CacheEvict(cacheNames = "course", key = "'tree'")
    @Override
    public boolean removeById(Serializable id) {
//        redisTemplate.delete("getCourseTree");
        return false;
    }
}
